#ifndef	_DOGADJAJI_H_
#define	_DOGADJAJI_H_

#include "vrijeme.h"

//"korisni" podaci o dogadjaju
typedef struct _dogadjaj_t_ {
	int tip;
	//mogucnost oznacavanja dogadjaja (nema predefiniranih tipova)

	int param;
	void *pparam;
	//opcionalni parametri uz dogadjaj (broj i kazaljka)
	
	int prio;
	//prioritet dogadjaja (0 ako nije bitan)

	vrijeme_t kada;
	//vrijeme kada se dogadjaj generirao
	
	int id_gen;
	//id dretve koja je generirala dogadjaj, 0 - jezgra

} dogadjaj_t;


int stvori_red_dogadjaja (int zast, int prio);
//stvori novi red dogadjaja, zastavice za stvaranje slijede ispod

#define	DOG_PO_REDU	(1<<0)
//dogadjaj se salje samo prvoj registriranoj dretvi

#define	DOG_SVIMA	(1<<1)
//dogadjaj se salje svim registriranim dretvama

#define	DOG_NIKOME	(1<<2)
//dogadjaj se ne proslijedjuje dalje (treba ga procitat)
//citanjem se dogadjaj mice iz reda (uzima ga jedna dr.)

#define	DOG_MICE_SE	(1<<3)
//nakon slanja dogadjaj se mice iz reda,
//ako niko nije prijavljen dogadjaj se NE pamti

#define	DOG_OSTAJE	(1<<4)
//nakon slanja prijavljenim dretvama dogadjaj ostaje u redu
//citanjem reda se dogadjaj mice (osim ako nije u pozivu postavljeno
//'DOG_OSTAVI')


int obrisi_red_dogadjaja (int id);
//brise red dogadjaja identificiran sa id-jem koji je jedini parametar


int prijavi_se_na_red_dogadjaja (int id, 
				 void (*funkcija) (dogadjaj_t *dog, void *),
				 void *param);
//dretva se prijavljuje na red dogadjaja:
//globalni ili lokalni (kada je id RED_DOG_DRETVE)


int postavi_dogadjaj (int tip, int param, void *pparam, int prio, 
			int kome, int id);
//dretva stvara dogadjaj i salje ga ili u neki globalni red ili izravno dretvi
//kome se salje definira se sa iducim konstantama
#define DOG_ZA_DRETVU	1
#define DOG_ZA_RED	2


int dohvati_dogadjaj_t (int id_reda, int tip, dogadjaj_t *dog, int zast,
			vrijeme_t *koliko);
//procitaj dogadjaj iz reda (zastavice koje se mogu koristiti slijede)
//oznaka reda (id) moze identificirati globalni red ili ako se zeli citati iz
//reda dretve koristi se iduca konstanta

#define	RED_DOG_DRETVE	-1
//definira red kao red dogadjaja dretve (koja poziva funkciju za dohvat ili
//postavljanje dogadjaja

#define	DOG_OSTAVI	(1<<5)
//ostavi dogadjaj u redu i nakon sto ga procitas (uzima se kopija)

#define	DOG_CEKAJ	(1<<6)
//blokiraj dretvu ako dogadjaja nema u redu

#define dohvati_dogadjaj(id_reda, tip, dog, zast)	\
	dohvati_dogadjaj_t(id_reda, tip, dog, zast, NULL)

/* dio izbacen iz koda jezgre, jer se ne izvodi u jezgri */
//funkcija koja se podmetne za obradu dogadjaja
//prava funkcija obrade salje se kao parametar
void obrada_dogadjaja (void *povratak,
		       void (*obrada_dog) (dogadjaj_t *, void *),
		       void *p, dogadjaj_t dogadjaj);

#endif	/* _DOGADJAJI_H_ */